import { def } from './util';
import defineReactive from './defineReactive';
import { arrayMethods } from './array';
import observe from './observe';
import Dep from './Dep';

/**
 * @classdesc 将一个正常的object转换为每层级属性都可以被Object set get方法侦测到的object
 */
export default class Observer {
    constructor(value) {
        //每一个Observer实例都有一个dep
        this.dep = new Dep();
        def(value, '__ob__', this, false);
        // console.log('我是Observer构造器', value);
        //数组原型方法重写
        if (Array.isArray(value)) {
            Object.setPrototypeOf(value, arrayMethods);
            this.observeArray(value);
            // console.log(value);
        } else {
            this.walk(value);
        }

    };
    /**
     * 遍历
     * @param {Object} value 
     */
    walk(value) {
        for (const key in value) {
            defineReactive(value, key)
        }
    };
    /**
     * 数组特殊遍历
     * @param {Array} arr 
     */
    observeArray(arr) {
        for (let i = 0, l = arr.length; i < l; i++) {
            //逐项observe
            observe(arr[i])
        }
    }
}